<?php

/**
 * This is the model class for table "member".
 * The followings are the available model relations:
 * @property Courses $courses
 */
class Member extends MemberBase
{
	public $code;
	public $courses_id;
	public $lastvisit_at;
	public $max_code;
	/**
	 * Returns the static model of the specified AR class.
	 * @return Member the static model class
	 */
	public static function model($className=__CLASS__)
	{
		return parent::model($className);
	}

	/**
	 * @return array validation rules for model attributes.
	 */
	public function rules()
	{
		// NOTE: you should only define rules for those attributes that
		// will receive user inputs.
		$rules =  array(
			array('fullname, cmnd , email, birthday, birthplace, address, contact_address, donor_name', 'required'),
			array('fullname, email', 'length', 'max'=>128),
			array('fullname', 'match', 'pattern' => '/^[a-zA-Zàáâãèéêìíòóôõùúăđĩũơưăạảấầẩẫậắằẳẵặẹẻẽềếểễệỉịọỏốồổỗộớờởỡợụủứừửữựỳỵỷỹ]+(\s[a-zA-Zàáâãèéêìíòóôõùúăđĩũơưăạảấầẩẫậắằẳẵặẹẻẽềếểễệỉịọỏốồổỗộớờởỡợụủứừửữựỳỵỷỹ]+)*?$/', 'message' => 'Tên thành viên không đúng.'),
			array('cmnd', 'length', 'max'=>12),
			array('cmnd', 'match', 'pattern' => '/^\d{9,12}$/','message' => 'Số chứng mình nhân dân không hợp lệ.'),
			array('cmnd', 'unique', 'message' => "Chứng minh nhân dân này đã được đăng kí."),
			array('sex', 'numerical', 'integerOnly'=>true),
			array('sex', 'in', 'range'=>array(SEX_BOY,SEX_GIRL), 'message' => 'Giới tính chưa được xác định.'),
			array('birthday', 'length', 'max'=>10),
			array('birthday', 'match', 'pattern' => '/^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/', 'message' => 'Ngày sinh không đúng.'),
			array('birthplace, address, contact_address, avatar, donor_address', 'length', 'max'=>255),
			array('email', 'email', 'message' => "Thư điện tử không hợp lệ."),
			array('email', 'match', 'pattern' => '/^(?!please_insert_email).*$/', 'message' => 'Thư điện tử không hợp lệ.'),
			array('email', 'unique', 'message' => "Thư điện tử này đã được đăng kí."),
			array('phone, cellphone', 'length', 'max'=>20),
			array('phone', 'match', 'pattern' => '/(^(0(\d{1}))(\d{8})$)|(^(0(\d{2}))(\d{7})$)/','message' => 'Số điện thoại không đúng. Định dạng đúng: (Mã vùng)xxxxxxxx hoặc (Mã vùng)xxxxxxx'),
			array('cellphone', 'match', 'pattern' => '/(^09(\d{8})$)|(^01(\d{9})$)/','message' => 'Số điện thoại di động không đúng. Định dạng đúng : 09xxxxxxxx hoặc 01xxxxxxxxx.'),
			array('donor_email', 'email', 'message' => "Thư điện tử của ân nhân không hợp lệ."),
			array('social_position, social_activity, max_code', 'safe'),
			// The following rule is used by search().
			// Please remove those attributes that should not be searched.
			array('cmnd, fullname, sex, birthday, birthplace, phone, cellphone, email, address, contact_address, avatar, user_id, social_position, social_activity', 'safe', 'on'=>'search'),
		);

		array_push($rules, array('code, courses_id', 'safe', 'on'=>'search'));


		if (!Yii::app()->user->isGuest) {
			$member			= Member::model()->findByPk(Yii::app()->user->id);
			if (Util::isRegister() && $member->avatar == "") {
				//array_push($rules, array('avatar', 'file', 'allowEmpty' => false, 'message' => 'Hình ảnh không được phép rỗng.'));
				$rules = array(array('avatar', 'file', 'allowEmpty' => false, 'message' => 'Hình ảnh là yêu cầu bắt buộc.'));
			}
			$oldAvatar		= (isset($member)) ? $member->avatar : '';
			$isNewAvatar	= (isset($_FILES['Member']['size']['avatar']) && $_FILES['Member']['size']['avatar'] > 0) ? true : false;
			if ($isNewAvatar || (!$isNewAvatar && $oldAvatar == '')) {
				array_push($rules, array('avatar', 'file', 'allowEmpty' => false, 'types' => FORMAT_IMAGE, 'message' => 'Chỉ có các file với các định dạng sau được phép sử dụng: jpg, gif, png.'));
			}
		}


		return $rules;
	}

	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels()
	{
		return array(
			'user_id' => 'ID account',
			'cmnd'	=> 'Số CMND',
			'fullname' => 'Tên thành viên',
			'sex' => 'Giới tính',
			'birthday' => 'Ngày sinh',
			'birthplace' => 'Nơi sinh',
			'phone' => 'Điện thoại',
			'cellphone' => 'Di động',
			'email' => 'Thư điện tử',
			'address' => 'Địa chỉ thường trú',
			'contact_address' => 'Địa chỉ liên lạc',
			'avatar' => 'Hình ảnh',
			'social_position' => 'Các chức vụ Đoàn/Hội/CLB đã từng nắm giữ (nếu có)',
			'social_activity' => 'Các hoạt động xã hội',
			'status'	=> 'Trạng thái',
			'code'	=> 'Mã sinh viên',
			'courses_id' => 'Khóa',
			'lastvisit_at' => 'Truy cập lần cuối',

			'donor_name' => 'Tên ân nhân',
			'donor_email' => 'Thư điện tử ân nhân',
			'donor_address' => 'Địa chỉ ân nhân',
		);
	}

	/**
	 * @return array relational rules.
	 */
	public function relations()
	{
		// NOTE: you may need to adjust the relation name and the related
		// class name for the relations automatically generated below.
		return array_merge(parent::relations(),array(
			'membercode' 	=> array(self::HAS_MANY, 'MemberCode', 'user_id'),
			'codeactive' 	=> array(self::HAS_ONE, 'MemberCode', 'user_id', 'on' => 'codeactive.active = 1'),
			'courses'		=> array(self::MANY_MANY, 'Courses', 'member_code(user_id, courses_id)'),
			'account' 		=> array(self::BELONGS_TO, 'Account', 'user_id'),
			'donorvisit'	=> array(self::HAS_MANY, 'DonorVisit', 'member_id'),
			'donorvisitcount'=>array(self::STAT, 'DonorVisit', 'member_id'),
		));
	}

	/**
     * Retrieves a list of models based on the current search/filter conditions.
     * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
     */
    public function countMember($courses_id)
    {
        // Warning: Please modify the following code to remove attributes that
        // should not be searched.
       return $this->findBySql(
       		"select MAX(CAST((SUBSTRING(member_code.code, -3)) AS UNSIGNED)) as max_code from users join member_code on member_code.user_id = users.id and member_code.courses_id = :course_id GROUP BY member_code.courses_id",
       		array(':course_id' => $courses_id)
       	);
    }

	/**
	 * Retrieves a list of models based on the current search/filter conditions.
	 * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
	 */
	public function search()
	{
		// Warning: Please modify the following code to remove attributes that
		// should not be searched.

		$criteria=new CDbCriteria;

		$criteria->together  	= true;
		$criteria->with 		= array('codeactive', 'courses');

		$criteria->compare('user_id',$this->user_id,true);
		$criteria->compare('fullname',$this->fullname,true);
		$criteria->compare('sex',$this->sex);
		$criteria->compare('birthday',$this->birthday,true);
		$criteria->compare('birthplace',$this->birthplace,true);
		$criteria->compare('phone',$this->phone,true);
		$criteria->compare('cellphone',$this->cellphone,true);
		$criteria->compare('email',$this->email,true);
		$criteria->compare('address',$this->address,true);
		$criteria->compare('contact_address',$this->contact_address,true);
		$criteria->compare('avatar',$this->avatar,true);
		$criteria->compare('social_position',$this->social_position,true);
		$criteria->compare('social_activity',$this->social_activity,true);
		$criteria->compare('status',$this->status);
		$criteria->compare('courses.id',$this->courses_id);

		if ($this->code != '') {
			$criteria->addSearchCondition('codeactive.code', $this->code . '%' , false, 'AND', 'LIKE');
		}

		return new CActiveDataProvider($this, array(
			'criteria'=>$criteria,
		));
	}

	/**
	 * getListMemberLogin
	 * Function get data for crontab send email to not login user
	 */
	public function getListMemberLogin()
    {
    	$time = date('Y-m-d H:i:s');
    	$criteria 	= new CDbCriteria();
    	$criteria->with			= array('account' => array('select' => array('user.username', 'user.lastvisit_at', 'DATEDIFF(NOW(), lastvisit_at) as day_sub')));
		$criteria->select		= array('t.fullname', 't.email');
        $criteria->order		= 'account.lastvisit_at asc';
		$criteria->condition	= 'ADDDATE(account.lastvisit_at, INTERVAL 1 MONTH) <= NOW()';

		return $this->findAll($criteria);
    }
}